package com.ljx.thread.thread04;

import java.util.Arrays;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author LJX
 * @Description: 第二种方式，使用手动锁
 * @Date: 2022/11/1 15:12
 * @Version 1.0
 */
public class ThreadSafeTest3 {
	private static  String[] arr=new String[2];
	private static int index=0;
	/**
	 *
	 */

	public static void main(String[] args) {
		/**
		 * 先new出来一个锁对象与synchronized相似
		 */
		ReentrantLock lock = new ReentrantLock();
		Thread t1 = new Thread(new Runnable() {

			@Override
			public void run() {
				// 加锁
				try{
					lock.lock();
					if (arr[index]==null){
						arr[index]="hello";
						index++;
					}
				}finally {
					// 释放锁释---我们把释放锁徐需要写在finally中
					lock.unlock();
				}

			}
		});

		Thread t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				// 加锁
				try{
					lock.lock();
					if (arr[index]==null){
						arr[index]="word";
						index++;
					}
				}finally {
					// 释放锁释---我们把释放锁徐需要写在finally中
					lock.unlock();
				}

			}
		});

		t1.start();
		t2.start();

		try {
			t1.join();
			t2.join();

		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		/**
		 * 不能直接输出，因为打印在主线程上，主线程和t1,t2线程在争抢资源
		 * 所以我们要先合并到主线程，让t1,t2线程先执行完
		 */
		System.out.println(Arrays.toString(arr));
	}
}
